package cn.wzptsoft.tinymallbe.controller;

import cn.wzptsoft.common.utils.BeanConverter;
import cn.wzptsoft.common.utils.PageData;
import cn.wzptsoft.common.utils.Result;
import cn.wzptsoft.tinymallbe.entity.Spu;
import cn.wzptsoft.tinymallbe.service.SpuService;
import cn.wzptsoft.tinymallbe.vo.SpuBriefVo;
import org.springframework.data.domain.Page;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

import javax.validation.constraints.Positive;
import java.util.List;

@RestController
@RequestMapping("spu")
@Validated
public class SpuController {
    private final SpuService spuService;

    public SpuController(SpuService spuService) {
        this.spuService = spuService;
    }

    /**
     * 商品列表分类查询
     *
     * @param start 起始数
     * @param count 每页查询数量
     * @return 商品列表分页结果
     */
    @GetMapping("/page")
    public Result<PageData<SpuBriefVo>> getSpuByPage(
            @RequestParam(defaultValue = "0") Integer start, @RequestParam(defaultValue = "10") Integer count) {
        // 计算第几页
        int pageNum = start / count;
        Page<Spu> pageResult = spuService.getSpuByPage(pageNum, count);
        // 得到分页结果 里面每个对象都是Spu类型
        // 而这个前端不需要看Spu的关联信息 所以需要将Spu对象转为不带关联字的Vo类型对象
        List<SpuBriefVo> simplePageResult = BeanConverter.convert(pageResult.getContent(), SpuBriefVo.class);
        // 最后封装到PageData类型对象中 返回前端
        PageData<SpuBriefVo> pageDataResult = new PageData<>(simplePageResult, pageResult.getTotalElements());
        return Result.ok(pageDataResult);
    }

    /**
     * 查找指定商品的详情
     *
     * @param id 商品ID
     * @return 商品详情
     */
    @GetMapping("/detail/{id}")
    public Result<Spu> getDetail(@PathVariable @Positive Long id) {
        Spu spu = spuService.getSpu(id);
        return Result.ok(spu);
    }

    /**
     * 查找指定商品分类下的商品
     *
     * @param id     分类ID
     * @param isRoot 是否根分类
     * @param start  起始数
     * @param count  每页查询数量
     * @return 商品列表分页结果
     */
    @GetMapping("/category/{id}")
    public Result<PageData<SpuBriefVo>> getByCategoryId(@PathVariable Long id,
                                                        @RequestParam(defaultValue = "false") Boolean isRoot,
                                                        @RequestParam(defaultValue = "0") Integer start,
                                                        @RequestParam(defaultValue = "10") Integer count) {
        int pageNum = start / count;
        Page<Spu> pageResult = spuService.getByCategory(id, isRoot, pageNum, count);
        // 得到的分页结果 里面的每个对象是Spu类型
        // 而这个前端不需要看Spu的关联信息 所以需要将Spu对象转为不带关联字段的VO类型
        List<SpuBriefVo> simplePageResult = BeanConverter.convert(pageResult.getContent(), SpuBriefVo.class);
        //最后封装到PageData类型中 返回前端
        PageData<SpuBriefVo> pageDataResult = new PageData<>(simplePageResult, pageResult.getTotalElements());
        return Result.ok(pageDataResult);
    }
}
